#coding=utf8
'''
@author: Torwald
'''

from worldexc.worldexception import WorldException
from worldexc.objectexception import ObjectDie 

ABSTRACT_CLASS = 0
THING_CLASS = 1
ACTOR_CLASS = 2



class BaseObject:
    '''Базовый класс для объектов мира. Реализует базовые действия
    и содержит общие для всех объектов параметры.
    '''
    
    count = 0
    class_type = ABSTRACT_CLASS
    eatable = False
    
    def __init__(self, id, health, max_health, 
                 world, parent_id=None, **kargs):
        self.x = kargs.get('x', None)
        self.y = kargs.get('y', None)
        self.direction = kargs.get('direction', None)
        self.id = id
        self.world = world
        self.parent_id = parent_id
        self.health = health
        self.max_health = max_health 
        self.alive = True # живой
        self.markers = kargs.get('marker', {})
        self.__class__.count += 1
        
    def die(self):
        '''Объект умирает.
        '''
        self.alive = False
        self.__class__.count -= 1
        raise ObjectDie(self)
    
    def is_alive(self):
        '''Проверяет живой ли объект.
        '''
        return self.alive
    
    def get_coords(self):
        '''Возвращает кортеж координат объекта.
        '''
        return (self.x, self.y)
    
    def set_coords(self, xy):
        '''Устанавливает координаты объекта из кортежа.
        '''
        self.x, self.y = xy
        
    def get_direction(self):
        '''Получить направление объекта.
        '''
        return self.direction
    
    def set_direction(self, direction):
        '''Задать направление объекта.
        '''
        self.direction = direction
    
    def set_marker(self, marker, value):
        '''Задать маркер.
        '''
        self.markers[marker] = value
        
    def get_marker(self, marker):
        '''Получить значение маркера.
        '''
        return self.markers.get(marker, None)
    
    def act(self):
        '''Действие, которое должно быть реализовано в других классах.
        '''
        pass
    
    def is_actor_class(self):
        '''Если класс является actor, возвращает True.
        '''
        return self.__class__.class_type == ACTOR_CLASS
    
    def is_thing_class(self):
        '''Если класс является неживым, возвращает True.
        '''
        return self.__class__.class_type == THING_CLASS
    
    def is_abstract_class(self):
        '''Если класс является абстрактным, то возвращает True.
        '''
        return self.__class__.class_type == ABSTRACT_CLASS
    
    def is_eatable(self):
        '''Возвращает True если объект можно съесть.
        '''
        return self.__class__.eatable
    
    def convert_object(self, convert_to):
        kargs = dict(x=self.x, y=self.y, direction=self.direction,
                     world=self.world, id=self.id, parent_id=self.parent_id,
                     health=self.health, max_health=self.max_health,
                     markers=self.markers)
        self.__class__.count -= 1
        return convert_to(**kargs)
    
    def __repr__(self):
        return '{0} XY: {1} Direction: {2}'.format(self.__class__.__name__,
                                                   self.get_coords(),
                                                   self.world.direction2str(self.direction))